perm filename FREE[SS,SYS] blob sn#328444 filedate 1978-01-17 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	TITLE FREE
C00014 ENDMK
C⊗;
TITLE FREE

A←1
B←2
C←3
D←4
E←5
R←6
S←7
T←10
TT←11
TTT←12
W←13
X←14
Y←15
Z←16
P←17

LOC 124
JRST REE
RELOC

REE:	SETOM ALL#
	CAIA
STRT:	SETZM ALL
STRTA:	RESET
	SETZM XDIST
	SETZM INUSE
	SETZM NINUSE
	SETZM DIST
	SETZM NFREE#
	SETZM NUSE#
	MOVE A,[DIST,,DIST+1]
	BLT A,DIST+177
	MOVEI P,PDL
	MOVEI A,37
	PEEK A,
	MOVEM A,MEMSIZ#
	HRLZS A
	TLZ A,401776
	SETPR2 A,
	JRST NOSETP
	MOVEI A,266
	PEEK A,
	MOVEM A,CORTAB#		;SYSTEM ADDRESS OF CORTAB
	SETZM INUSE#
	SETZM NINUSE#
	INIT 0,0
	'LPT   '
	HEAD,,0
	JRST NOLPT
	SETZM NAME+3
	SETZM NAME+2
	HLLZS NAME+1
	ENTER NAME
	JRST [	OUTSTR [ASCIZ /ENTER FAILED!
/]
		HALT STRTA	]
	OUTBUF 0,2
	MOVE R,[POINT 7,[ASCIZ /LOC	IN USE	FREE

/]]
	SKIPN ALL
	PUSHJ P,PUTSTR
	MOVE Z,400263			;GET ADDRESS OF MEMSIZ
	MOVE Z,400000(Z)		;GET MEMSIZ
	MOVE A,[400000(Z)]
	MOVEM A,SYSLOC#
	MOVE A,MEMSIZ
	CAIG A,377777
	JRST LOOP
	CAIE A,777777
	JRST [	OUTSTR [ASCIZ /CAN'T MAP TO IT!
/]
		HALT STRT	]
	MOVE A,[376001,,400000]
	SETPR2  ,
	JRST NOSET
	MOVNI A,400000(A)
	HRRM A,SYSLOC
LOOP:	SKIPE ALL			;Z contains low address of an fs block
	JRST NOLOC
	HRRZ B,Z
	PUSHJ P,OCTPNT			;print address
	MOVEI S,11
	PUSHJ P,PUTOUT
NOLOC:	MOVEM Z,LAST#			;last address processed
	TRNE Z,777			;crossing a PAGE boundary?
	JRST NOTK			;no.
	MOVEI B,(Z)			;GET address (on a PAGE boundary)
	LSH B,-=9			;shift
	ADD B,CORTAB
	PEEK B,				;Cortab word from system
	LDB B,[POINT 9,B,26]		;Select appropriate byte
	CAIN B,105			;105 is the normal fs byte
	JRST NOTK			;if normal, we avoid the rest of this.
	CAIE B,110			;SPECIAL CODE FOR PAGE MAPS
	JRST INCONS
	IORI Z,777			;ADVANCE TO END OF THIS BLOCK
	MOVEI B,1000			;SIZE OF BLOCK
	ADDM B,INUSE			;COUNT AS IN USE
	SKIPN ALL
	PUSHJ P,OCTPNT			;PRINT BLOCK SIZE (IN USE)
	AOS NUSE			;count blocks that are in use
	AOS XDIST			;NUMBER OF PAGES IN USE AS PAGE MAPS
	SKIPE ALL
	JRST DONE			;done if not printing
	MOVE R,[POINT 7,[ASCIZ/		PAGE MAP BLOCK.  /]]
	PUSHJ P,PUTSTR
	JRST DONE

NOTK:	HRRZ Z,@SYSLOC			;pointer to highest word in this block
	CAMLE Z,LAST			;high address should exceed low address
	CAMLE Z,MEMSIZ			;but be smaller than size of real memory
	JRST INCONS
	HLRZ B,@SYSLOC
	TRZ B,400000			;clear the "IN USE" bit, leaving size
	MOVEI S,11
	SKIPN ALL
	SKIPG @SYSLOC
	CAIA
	PUSHJ P,PUTOUT			;extra tab if block is free
	SKIPN ALL
	PUSHJ P,OCTPNT			;block size
	SKIPG @SYSLOC			;free or in use?
	JRST LOCUSE			;in use
	AOS NFREE			;count a free block
	HLRZ B,@SYSLOC			;get the size again
	TRZ B,400000
	ADDM B,NINUSE			;count size of Not IN USE
	MOVSI C,1
	CAIL B,200
	MOVEI B,0
	ADDM C,DIST(B)			;count distribution of sizes
	JRST DONE

LOCUSE:	AOS NUSE			;count blocks that are in use
	HLRZ B,@SYSLOC
	TRZ B,400000
	ADDM B,INUSE			;increase count of amount IN USE
	CAIL B,200
	MOVEI B,0
	AOS DIST(B)
	SKIPE ALL
	JRST DONE			;done if not printing
	HLRZ B,@SYSLOC
	TRZ B,400000
	LSH B,-3			;size/8
	CAIG B,NAMLEN
	SKIPN R,NAMTAB-1(B)
	JRST DONE			;done if there's no name for this size
	HRLI R,(<POINT 7,0>)
	PUSHJ P,PUTSTR
DONE:	MOVE R,[POINT 7,CRLF]
	SKIPN ALL
	PUSHJ P,PUTSTR
	CAMGE Z,MEMSIZ			;done yet?
	AOJA Z,LOOP			;no. advance to low end of next block
	MOVE R,[POINT 7,CRLF]
	PUSHJ P,PUTSTR
	MOVE R,[POINT 7,CRLF]
	PUSHJ P,PUTSTR
	MOVE B,INUSE
	PUSHJ P,OCTPNT
	MOVE R,[POINT 7,[ASCIZ / TOTAL WORDS IN USE.
/]]
	PUSHJ P,PUTSTR
	MOVE B,NINUSE
	PUSHJ P,OCTPNT
	MOVE R,[POINT 7,[ASCIZ / TOTAL WORDS FREE.

	(USED)	(FREE)
SIZE	NUMBER	NUMBER

/]]
	PUSHJ P,PUTSTR
	MOVEI D,1
LOOP2:	SKIPN DIST(D)
	JRST DONE1
	MOVEI B,(D)
	PUSHJ P,OCTPNT
	MOVEI S,11
	PUSHJ P,PUTOUT
	HRRZ B,DIST(D)
	PUSHJ P,OCTPNT
	MOVEI S,11
	PUSHJ P,PUTOUT
	HLRZ B,DIST(D)
	PUSHJ P,OCTPNT
	MOVEI S,11
	PUSHJ P,PUTOUT
	HRRZ B,DIST(D)
	IMULI B,(D)
	PUSHJ P,DPT
	MOVEI B,(D)
	LSH B,-3
	CAIG B,NAMLEN
	SKIPN R,NAMTAB-1(B)
	JRST NONAM
	HRLI R,(<POINT 7,,6>)
	PUSHJ P,PUTSTR
NONAM:	MOVE R,[POINT 7,CRLF]
	PUSHJ P,PUTSTR
DONE1:	CAIGE D,177
	AOJA D,LOOP2
	MOVE R,[POINT 7,[ASCIZ /≥ 200	/]]
	PUSHJ P,PUTSTR
	HRRZ B,DIST
	PUSHJ P,OCTPNT
	MOVEI S,11
	PUSHJ P,PUTOUT
	HLRZ B,DIST
	PUSHJ P,OCTPNT
	MOVE R,[POINT 7,CRLF]
	PUSHJ P,PUTSTR
	MOVE B,XDIST		;NUMBER OF PAGES USED
	PUSHJ P,DP1
	MOVE R,[POINT 7,[ASCIZ / page maps.
/]]
	PUSHJ P,PUTSTR
	MOVE R,[POINT 7,CRLF]
	PUSHJ P,PUTSTR
	MOVE B,NFREE
	PUSHJ P,OCTPNT
	MOVE R,[POINT 7,[ASCIZ / FREE BLOCKS.
/]]
	PUSHJ P,PUTSTR
	MOVE B,NUSE
	PUSHJ P,OCTPNT
	MOVE R,[POINT 7,[ASCIZ / USED BLOCKS.
/]]
	PUSHJ P,PUTSTR
	MOVEI Z,247
	PEEK  Z,
	MOVEI B,1(Z)		;NFSGETS
	PEEK B,
	MOVEI X,2(Z)		;NFSGIVES
	PEEK X,
	MOVE Y,B
	PUSHJ P,OCTPNT
	MOVE R,[POINT 7,[ASCIZ / NFSGETS
/]]
	PUSHJ P,PUTSTR
	MOVE B,X
	SUB Y,B
	PUSHJ P,OCTPNT
	MOVE R,[POINT 7,[ASCIZ / NFSGIVES
/]]
	PUSHJ P,PUTSTR
	MOVEI B,30(Z)
	PEEK B,
	SUB Y,B
	PUSHJ P,OCTPNT
	MOVE R,[POINT 7,[ASCIZ / NFSGFA
/]]
	PUSHJ P,PUTSTR
	MOVE B,Y
	PUSHJ P,OCTPNT
	MOVE R,[POINT 7,[ASCIZ / BLOCKS STILL CLAIMED
/]]
	PUSHJ P,PUTSTR
	MOVEI Z,264
	PEEK Z,
	MOVSI Y,-17
	MOVE R,[POINT 7,[ASCIZ /


REQUEST POPULATIONS:
SIZE	COUNT
/]]
	PUSHJ P,PUTSTR
RPQLOP:	MOVE B,Z
	ADDI B,(Y)
	PEEK B,
	JUMPE B,RPQSKP
	PUSH P,B
	MOVEI B,1(Y)
	LSH B,3
	PUSHJ P,OCTPNT		;PRINT OCTAL.
	MOVEI S,11
	PUSHJ P,PUTOUT
	POP P,B
	PUSHJ P,OCTPNT
	MOVE R,[POINT 7,CRLF]
	PUSHJ P,PUTSTR
RPQSKP:	AOBJN Y,RPQLOP
	EXIT

NAMTAB:	[ASCIZ /		JOB READ OR WRTINF/]		;0-6
	[ASCIZ /		DATA DISK QUEUE BLOCK/]		;7-16
	[ASCIZ /		RUN UUO OR JBTJL/]		;17-26
	[ASCIZ /		IMP DDB/]			;27-36
	[ASCIZ /		WHO LINE OR MAIL/]		;37-46
	[ASCIZ /		IMP MESSAGE BLOCK/]		;47-56
	[ASCIZ /		PAGE PRINTER BLOCK/]		;57-66
	0							;67-76
	[ASCIZ /		JBTDTS/]			;77-106
	[ASCIZ /		DSK DDBS/]			;107-116
	[ASCIZ /		TTY DDBS OR LINE POINTER TABLE/];117-126
	[ASCIZ /		JBTPDL/]			;127-136
	[ASCIZ /		DISPLAY HEADER OR BLK TBL FOR DPYOUT/]	;137-146
	0						;147-156
	0						;157-166
	0						;167-176
	[ASCIZ /		APRLST - TIMED USER INTERRUPT LIST/]	;177-206
NAMLEN←←.-NAMTAB

DPT:	PUSHJ P,DP1
	MOVEI S,"."
	JRST PUTOUT

DP1:	SKIPA C,[=10]
OCTPNT:	MOVEI C,10
	HRRM C,OCTPN1
OCTPN1:	IDIVI B,10
	HRLM C,(P)
	JUMPE B,.+2
	PUSHJ P,OCTPN1
OCTOUT:	HLRZ S,(P)
	ADDI S,60
	PUSHJ P,PUTOUT
	POPJ P,
PUTOUT:	SOSG HEAD+2
	OUT
	CAIA
	HALT STRTA
	IDPB S,HEAD+1
CPOPJ:	POPJ P,

PUTSTR:	ILDB S,R
	JUMPE S,CPOPJ
	PUSHJ P,PUTOUT
	JRST PUTSTR

LIT↔VAR

NAME:	'FREE  '
	'LST   '
	0
	0
HEAD:	BLOCK 3
PDL:	BLOCK 10
XDIST:	0				;count 1k blocks used as pmaps
DIST:	BLOCK 200
CRLF:	BYTE(7)15,12
NOSETP:
NOSET:	OUTSTR [ASCIZ /SETPR2 FAILURE
/]
	EXIT
NOLPT:	OUTSTR [ASCIZ /CAN'T INIT THE LPT
/]
	EXIT
INCONS:	OUTSTR [ASCIZ /FREE STORAGE BLOCKS ARE INCONSISTIENT
/]
	EXIT

PNTRS:	POINT 9,B,8
	POINT 9,B,17
	POINT 9,B,26
	POINT 9,B,35

	END STRT